package Guigu3.Block;
/*
 * 类的成员之四：代码块(或初始化块)
 * 
 * 1、代码块的作用：用来初始化类、对象
 * 2、代码块如果有修饰的话，只能使用static。
 * 3、分类：静态代码块 vs 非静态代码块
 * 
 * 4、静态代码块
 *      >内部可以有输出语句
 *      >随着类的加载而执行，而且只执行一次
 *      >作用：初始化类的信息
 *      >如果一个类中定义了多个静态代码块，则按照声明先后顺序执行
 *      >静态代码块的执行要优先于非静态代码块的执行
 *      >静态代码块内只能调用静态的属性、静态的方法，不能调用非静态的结构
 *      
 * 5、非静态代码块
 *      >内部可以有输出语句
 *      >随着类的创建而执行
 *      >每创建一个对象，就执行一次非静态代码块
 *      >作用：可以在创建对象时，对对象的属性等进行初始化
 *      >如果一个类中定义了多个非静态代码块，则按照声明的先后顺序执行
 *      >非静态代码块内可以调用静态的属性、静态的方法，或非静态的属性、非静态的方法
 * 
 * 对属性可以赋值的位置
 * ① 默认初始化
 * ② 显示初始化
 * ③ 构造器中初始化
 * ④ 有了对象以后，可以通过“对象.属性”或“对象.方法”的方式，进行赋值
 * ⑤ 在代码块中赋值
 * 
 * 执行的先后顺序：①——②/⑤——③——④
 */
public class BlockTest {

	public static void main(String[] args) {
		
		String desc = Per.desc;
		System.out.println(desc);
		Per p1 = new Per();
		System.out.println(p1.age);
		Per p2 = new Per();
	}

}

class Per
{
	String name;
	int age;
	static String desc;
	
	public Per()
	{
		
	}
	public Per(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	//静态代码块
	static
	{
		desc = "我是谁";
		System.out.println("我是一个人");
		info();
	}
	//非静态代码块
	{
		age = 18;
		System.out.println("你好，代码块");
	}
	
	public void eat()
	{
		System.out.println("吃饭");
	}
	public static void info()
	{
		System.out.println("我是一个快乐的人");
	}
}
